from base.base import get_tile_index, wgs_84_to_mector, down_img
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED, FIRST_COMPLETED


def down_tile(level_min, level_max, lat_min, lat_max, lng_min, lng_max, pos, url):
    """
    爬虫影像
    :param level_min:
    :param level_max:
    :param lat_min:
    :param lat_max:
    :param lng_min:
    :param lng_max:
    :param pos:
    :param url:
    :return:
    """
    # 校验大小
    if level_min > level_max:
        level_min, level_max = level_max, level_min
    if lat_min > lat_max:
        lat_min, lat_max = lat_max, lat_min
    if lng_min > lng_max:
        lng_min, lng_max = lng_max, lng_min
    x_min, y_min = wgs_84_to_mector(lat_min, lng_min)
    x_max, y_max = wgs_84_to_mector(lat_max, lng_max)
    # 计算全部索引
    indexs = []
    for i in range(level_min, level_max + 1):
        indexs.extend(get_tile_index(i, 0, x_min, x_max, y_min, y_max))

    executor = ThreadPoolExecutor(max_workers=10)
    print("共需下载瓦片"+str(len(indexs))+"块")
    all_task = []
    for tile_index in indexs:
        args = [url, pos, tile_index[0], tile_index[1], tile_index[2]]
        all_task.append(executor.submit(lambda p: down_img(*p), args))

    wait(all_task, return_when=ALL_COMPLETED)
    print("全部下载完成")
